<?php
namespace builder\v2;

//简化版
//实际上就是构建了一个对象，只不过这个对象比较复杂，复杂到这个对象有点像容器，比如一个属性都可以当成一个对象。
//换句话说，有个像容器一样的对象，比较复杂，里面装着各种对象。
//建造者是创建一个复杂对象的一部分接口，有时候这个接口也可以看成是一个适配器，隐藏了复杂的创建过程，对外提供统一的调用方法。

abstract class Vehicle
{
    private $_data;

    public function setPart($key, $value)
    {
        $this->_data[$key] = $value;
    }

    public function getPart()
    {
        return $this->_data;
    }
}

class Truck extends Vehicle
{

}

class Car extends Vehicle
{
    
}

class Engine
{

}

class Wheel
{

}

class Door
{

}

//实例化一个产品 做为一个具体构建者类来包装
$vehicle = new Truck();
//添加发动机 可以做为一个方法包装
$vehicle->setPart('truckEngine', new Engine()); 
//添加轮子 可以做为一个方法包装
$vehicle->setPart('wheel1', new Wheel());
$vehicle->setPart('wheel2', new Wheel());
$vehicle->setPart('wheel3', new Wheel());
$vehicle->setPart('wheel4', new Wheel());
$vehicle->setPart('wheel5', new Wheel());
$vehicle->setPart('wheel6', new Wheel());
//添加车门 可以做为一个方法包装
$vehicle->setPart('leftDoor', new Door());
$vehicle->setPart('rightDoor', new Door());
//获取这个产品 可以做为一个方法包装
var_dump($vehicle->getPart()); //开始使用产品
//从实例化产品、添加零件到返回产品对象这个过程，又可以做为一个导演类来包装

$vehicle = new Car();
$vehicle->setPart('carEngine', new Engine());
$vehicle->setPart('wheel1', new Wheel());
$vehicle->setPart('wheel2', new Wheel());
$vehicle->setPart('wheel3', new Wheel());
$vehicle->setPart('wheel4', new Wheel());
$vehicle->setPart('leftDoor', new Door());
$vehicle->setPart('rightDoor', new Door());
var_dump($vehicle->getPart());